home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / Regexp / regsub.c < prev    next >
Text File  |  1991-04-09  |  2KB  |  85 lines

  1. /*
  2.  * regsub
  3.  * @(#)regsub.c    1.3 of 2 April 86
  4.  *
  5.  *    Copyright (c) 1986 by University of Toronto.
  6.  *    Written by Henry Spencer.  Not derived from licensed software.
  7.  *
  8.  *    Permission is granted to anyone to use this software for any
  9.  *    purpose on any computer system, and to redistribute it freely,
  10.  *    subject to the following restrictions:
  11.  *
  12.  *    1. The author is not responsible for the consequences of use of
  13.  *        this software, no matter how awful, even if they arise
  14.  *        from defects in it.
  15.  *
  16.  *    2. The origin of this software must not be misrepresented, either
  17.  *        by explicit claim or by omission.
  18.  *
  19.  *    3. Altered versions must be plainly marked as such, and must not
  20.  *        be misrepresented as being the original software.
  21.  */
  22. #include <stdio.h>
  23. #include "regexp.h"
  24. #include "regmagic.h"
  25. #include    "regproto.h"
  26. #include    "string.h"
  27.  
  28. #ifndef CHARBITS
  29. #define    UCHARAT(p)    ((long)*(unsigned char *)(p))
  30. #else
  31. #define    UCHARAT(p)    ((long)*(p)&CHARBITS)
  32. #endif
  33.  
  34. /*
  35.  - regsub - perform substitutions after a regexp match
  36.  */
  37. void
  38. regsub(prog, source, dest)
  39. regexp *prog;
  40. char *source;
  41. char *dest;
  42. {
  43.     register char *src;
  44.     register char *dst;
  45.     register char c;
  46.     register long no;
  47.     register long len;
  48.     extern char *strncpy();
  49.  
  50.     if (prog == NULL || source == NULL || dest == NULL) {
  51.         regerror("NULL parm to regsub");
  52.         return;
  53.     }
  54.     if (UCHARAT(prog->program) != MAGIC) {
  55.         regerror("damaged regexp fed to regsub");
  56.         return;
  57.     }
  58.  
  59.     src = source;
  60.     dst = dest;
  61.     while ((c = *src++) != '\0') {
  62.         if (c == '&')
  63.             no = 0;
  64.         else if (c == '\\' && '0' <= *src && *src <= '9')
  65.             no = *src++ - '0';
  66.         else
  67.             no = -1;
  68.  
  69.         if (no < 0) {    /* Ordinary character. */
  70.             if (c == '\\' && (*src == '\\' || *src == '&'))
  71.                 c = *src++;
  72.             *dst++ = c;
  73.         } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
  74.             len = prog->endp[no] - prog->startp[no];
  75.             (void) strncpy(dst, prog->startp[no], len);
  76.             dst += len;
  77.             if (len != 0 && *(dst-1) == '\0') {    /* strncpy hit NUL. */
  78.                 regerror("damaged match string");
  79.                 return;
  80.             }
  81.         }
  82.     }
  83.     *dst++ = '\0';
  84. }
  85.